/*
 * JFrame.java
 *
 * Created on 18 janvier 2004, 21:30
 */
package gui;

import controle.Controle;
import requetes.Deplacement;

import java.awt.*;

/**
 * @author oui
 */

public class GUIFrame extends javax.swing.JFrame implements
		java.awt.event.ActionListener {
	/**
	 * 
	 */

	private static final long serialVersionUID = 1L;

	int nb_etages;

	int hauteur_etage;

	final boolean avec_ouverture_fermeture = false;

	/** les boutons de la fenetre des boutons */
	Button stop;

	/** les boutons de la fenetre des boutons */
	Button open;

	/** les boutons de la fenetre des boutons */
	Button close;

	/** Les boutons de tous les etages */
	java.util.ArrayList<Button> boutons;

	java.awt.Color bg_color;

	/** Animation des portes */
	Portes portes;

	/** Fleche de sens de deplacement */
	Fleches fleches;

	Controle ordonnanceur;

	/** Classe dessinant les portes de l'ascenseur */
	private class Portes extends Panel{

		private static final long serialVersionUID = 1L;
		
		/** Largeur de l'ouverture */
		private final static int largeur = 280;
		/** Hauteur de l'ouverture */
		private final static int hauteur = 300;

		/** nombre de pas maximal */
		private int max;

		/** nombre de pas effectues */
		private int p;

		public Portes(){

			super();

			setBackground( Color.red );

			max = 100;
			p = 0;

		}

		public void setOuverture( int p, int max ){

			this.p = p;
			this.max = max;

			repaint();

		}

		public void paint( Graphics gc ){

			float r =  ((float)p/(float)max); 
			int x = (int) ((largeur/2) - ((largeur/2)*r));
			int l = largeur - (2*x)+1;

			gc.setColor( Color.black );
			gc.fillRect( x, 0, l, hauteur );


		}

	}

	/** Classe dessinant les fleches de l'ascenseur */
	private class Fleches extends Panel{

		private static final long serialVersionUID = 1L;
		
		/** Largeur des fleches */
		private final static int largeur = 40;
		/** Hauteur des fleches */
		private final static int hauteur = 60;

		/** sens du deplacement */
		private int sens;

		public Fleches(){

			super();

			setBackground( Color.gray );

			sens = Deplacement.INDEFINI;

		}

		public void setSens( int sens ){

			this.sens = sens;

			repaint();

		}

		public void paint( Graphics gc ){

			// fleche en haut
			if(sens==Deplacement.MONTEE) gc.setColor( Color.yellow );
			else gc.setColor( Color.red );
			gc.fillRect(15,10,10,10);

			Polygon triangle = new Polygon ();
			triangle.addPoint( 20,0 );
			triangle.addPoint( 30,10 );
			triangle.addPoint( 10,10 );
			gc.fillPolygon (triangle) ;

			// rectangle du centre
			if(sens==Deplacement.INDEFINI) gc.setColor( Color.yellow );
			else gc.setColor( Color.red );
			gc.fillRect(10,25,20,10);

			// fleche en bas
			if(sens==Deplacement.DESCENTE) gc.setColor( Color.yellow );
			else gc.setColor( Color.red );
			gc.fillRect(15,40,10,10);
			triangle = new Polygon ();
			triangle.addPoint( 20,60 );
			triangle.addPoint( 30,50 );
			triangle.addPoint( 10,50 );
			gc.fillPolygon (triangle) ;
		}

	}

	/** Creates new form JFrame */
	public GUIFrame(int nb_etage, int hauteur_Etage) {
		nb_etages = nb_etage;
		hauteur_etage = hauteur_Etage;
		
		initComponents();

		cabine.setMajorTickSpacing(0);
		cabine.setMaximum(nb_etages);
		
		ordonnanceur = null;
	}

	public void assigne_ordonnanceur(Controle l_ordonnanceur) {
		ordonnanceur = l_ordonnanceur;

		/* maintenant que l'on a tout, on peut d'afficher */
		//show();
		setVisible( true );
		cree_fenetre_boutons();
	}

	public void cree_fenetre_boutons() {
		Frame fenetre = new Frame();
		boutons = new java.util.ArrayList<Button>((nb_etages + 1) * 3);

		fenetre.setLayout(new java.awt.GridLayout(nb_etages + 1, 3, 3, 3));
		fenetre.setSize(150, 40 * nb_etages);
		fenetre.setTitle("Fenetre du controleur");

		stop = new Button("STOP");
		bg_color = stop.getBackground();

		stop.setForeground(new java.awt.Color(255, 0, 0));
		stop.addActionListener(this);
		fenetre.add(stop);

		if (avec_ouverture_fermeture) {
			fenetre.add(open = new Button("|< >|"));
			open.addActionListener(this);
			fenetre.add(close = new Button(">|<"));
			close.addActionListener(this);
		} else {
			fenetre.add(new Label());
			fenetre.add(new Label());
		}

		Button tmp;
		for (int i = nb_etages - 1; i > -1; i--) {
			fenetre.add(tmp = new java.awt.Button(String.valueOf(i)));
			boutons.add(tmp);
			tmp.addActionListener(this);
			if (i < nb_etages - 1) {
				fenetre.add(tmp = new Button("^"));
				boutons.add(tmp);
				tmp.addActionListener(this);
			} else {
				fenetre.add(new Label());
				boutons.add(null);
			}
			if (i > 0) {
				fenetre.add(tmp = new Button("v"));
				boutons.add(tmp);
				tmp.addActionListener(this);
			} else {
				fenetre.add(new Label());
				boutons.add(null);
			}
		}
		//fenetre.show();
		fenetre.setVisible( true );
	}

	/**
	 * This method is called from within the constructor to initialize the form.
	 * WARNING: Do NOT modify this code. The content of this method is always
	 * regenerated by the Form Editor.
	 */
	private void initComponents() { // GEN-BEGIN:initComponents

		portes = new Portes();
		fleches = new Fleches();
		position = new javax.swing.JTextPane();
		cabine = new javax.swing.JSlider();


		getContentPane().setLayout(
				new org.netbeans.lib.awtextra.AbsoluteLayout());



		addWindowListener(new java.awt.event.WindowAdapter() {
			public void windowClosing(java.awt.event.WindowEvent evt) {
				exitForm(evt);
			}
		});

		position.setFont(new java.awt.Font("Dialog", 0, 24));
		position.setForeground(new java.awt.Color(0, 0, 204));
		position.setText("0");
		position.setToolTipText("Affichage de la position de l'ascenseur");
		position.setMargin(new java.awt.Insets(3, 15, 3, 3));
		getContentPane().add(
				position,
				new org.netbeans.lib.awtextra.AbsoluteConstraints(140, 50, 60, 40));

		getContentPane().add(portes,
				new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 100, 280, 300));

		getContentPane().add(fleches,
				new org.netbeans.lib.awtextra.AbsoluteConstraints(310, 200, 40, 60));

		cabine.setMajorTickSpacing(10);
		cabine.setMaximum(10);
		cabine.setMinorTickSpacing(1);
		cabine.setOrientation(javax.swing.JSlider.VERTICAL);
		cabine.setPaintTicks(true);
		cabine.setToolTipText("Repr\u00e9sentation de l'ascenseur");
		cabine.setValue(0);
		cabine
				.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
					public void propertyChange(
							java.beans.PropertyChangeEvent evt) {
						cabinePropertyChange(evt);
					}
				});

		getContentPane().add(
				cabine,
				new org.netbeans.lib.awtextra.AbsoluteConstraints(350, 10, 60, 430));

		//getContentPane().add(
		//		zone_de_debogage,
		//		new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 200, 310, 200));

		pack();
	} // GEN-END:initComponents

	private void cabinePropertyChange(java.beans.PropertyChangeEvent evt) { // GEN-FIRST:event_cabinePropertyChange
		// Add your handling code here:
	} // GEN-LAST:event_cabinePropertyChange

	/** Exit the Application */
	private void exitForm(java.awt.event.WindowEvent evt) { // GEN-FIRST:event_exitForm
		System.exit(0);
	} // GEN-LAST:event_exitForm

	public void changePosition(int etage) {
		cabine.setValue(etage);
		position.setText(String.valueOf(etage));
	}

	public void ajouteMessage(java.lang.String message) {
		//zone_de_debogage.setText(message + "\n" + zone_de_debogage.getText());
		//zone_de_debogage.invalidate();
	}

	/** allume le bouton correspondant au repere */
	public void allumer_bouton(Deplacement repere) {
		int index = (nb_etages - 1 - repere.etage) * 3;

		if (repere.descend()) {
			index += 2;
		} else if (repere.monte()) {
			index += 1;

		}
		((Button) boutons.get(index)).setBackground(Color.YELLOW);
	}

	/** eteint le bouton correspondant au repere */
	public void eteindre_bouton(Deplacement repere) {
		int index = (nb_etages - 1 - repere.etage) * 3;
		if (repere.descend()) {
			index += 2;
		} else if (repere.monte()) {
			index += 1;

		}
		((Button) boutons.get(index)).setBackground(null);
	}

	public void actionPerformed(java.awt.event.ActionEvent e) {
		if (e.getSource() == stop) {
			ordonnanceur.arret_urgence();
		} else {
			ordonnanceur.demander(transforme_en_deplacement(e.getSource()));
		}
	}

	Deplacement transforme_en_deplacement(Object obj) {
		int index = boutons.indexOf(obj);
		if (index == -1) {
			System.out.println("[gui] transforme_en_deplacement: Erreur de bouton");
			return null;
		}
		int sens;

		if ((index % 3) == 0) {
			sens = Deplacement.INDEFINI;
		} else if ((index % 3) == 1) {
			sens = Deplacement.MONTEE;
		} else {
			sens = Deplacement.DESCENTE;
		}
		return new Deplacement(sens, nb_etages - 1 - (index / 3));
	}

	public void setOuverture( int p, int max ){

		portes.setOuverture( p, max );

	}

	public void setSens( int sens ){

		fleches.setSens( sens );

	}

	// Variables declaration - do not modify//GEN-BEGIN:variables
	private javax.swing.JSlider cabine;

	private javax.swing.JTextPane position;

	private java.awt.TextArea zone_de_debogage;
	// End of variables declaration//GEN-END:variables

}
